# -*- coding: utf-8 -*-
from flask import Blueprint,request,redirect,jsonify
from common.libs.Helper import ops_render,iPagination,getCurrentDate
# 1.首先我们先引入common.models.User模块下的User
from common.libs.UrlManager import UrlManager
from common.libs.user.UserService import UserService
from common.libs.LogService import AppAccessLog
from common.models.User import User
from sqlalchemy import or_
from application import app,db

route_account = Blueprint( 'account_page',__name__ )

@route_account.route( "/index" )
def index():
    # 3.列表页面
    resp_data={}

    # d. page的参数       如果page参数在我们的req中并且有值,否则默认是1页
    req=request.values
    page =int(req['p'] ) if ('p' in req and req['p']) else 1

    # a. 分页：定义默认每页多少条以及每一页的页数。 未使用flask插件中的功能，自行写了一个。
    # 抽取公用变量query的引用
    query = User.query

    # ①获取字段  混合查询
    if 'mix_kw' in req:
         # or查询 需要先到如 sqlachemy中的 or_   查询内容为用户名和 手机号
        rule = or_( User.nickname.ilike("%{0}%".format(req['mix_kw'])),
                    User.mobile.ilike("%{0}%".format(req['mix_kw'])),
                    User.email.ilike("%{0}%".format(req['mix_kw'])))
        query=query.filter(rule) #组合查询

    # ②status 查询 ：有效无效的查询
    if 'status' in req and int(req['status']) >-1:
        query =query.filter( User.status == int(req['status']))

    # b.先取出总页数
    # query.count()
    # c.计算每一页大小 50页 方法类iPagination的使用是一些参数
    page_params = {
        'total':query.count(),
        'page_size':app.config['PAGE_SIZE'],
        # d中的page
        'page':page,
        # e. 页码展示逻辑为半圆计算(Helper)
        'display':app.config['PAGE_DISPLAY'],
        # 'url':'/account/index' 这样写写死了
        'url': request.full_path.replace("&p={}".format(page),"")#p等于当前页
    }

    pages = iPagination( page_params)
    # f.  offset=当前页数-1  再乘 page_size(偏移量)
    offset = ( page -1) * app.config['PAGE_SIZE']
    # h 每一页取多少
    limit = app.config['PAGE_SIZE']* page

    # 2.数据查询再展示(通过 全量查询 uid字段进行 倒序 取出所有数据) 放入list
    # 再通过列表进行展示 i.[offset:limit]分页
    list = query.order_by( User.uid.desc() ).all()[offset:limit]

    # 4.list就等于我们取出来的list
    resp_data['list'] = list
    # j.将值传到前面才能使用了
    resp_data['pages'] = pages

    # ③将我们搜索的字段在input方法中展示出来
    resp_data['search_con'] = req

    # 循环展示状态
    resp_data['status_mapping']=app.config['STATUS_MAPPING']

    # 5.将resp_data(json)作为参数传递进来
    # resp_data['search_con'] = req
    # resp_data['status_mapping'] = app.config['STATUS_MAPPING']
    return ops_render( "account/index.html",resp_data )

@route_account.route( "/info" )
def info():
    resp_data ={} # resp_data是一个json
    req = request.args #request.args只取get参数  values将所有参数拼装好放在一个字典中
    uid = int(req.get('id',0))
    reback_url=UrlManager.buildUrl("/account/index")
    if uid < 1:#如果uid不存在
        return  redirect(reback_url)

    # 查询用户信息是否存在
    info = User.query.filter_by( uid = uid).first()
    if not info:
        return  redirect(reback_url)

    access_list = AppAccessLog.query.filter_by(uid=uid).order_by(AppAccessLog.id.desc()).limit(100).all()

    resp_data['info'] = info
    resp_data['access_list'] = access_list

    # 将resp_data(info)传递到info.html中
    return ops_render( "account/info.html",resp_data )

@route_account.route( "/set",methods=["GET","POST"])
# 设计到表单的提交数据，ajax提交
def set():
    default_pwd = "******"
    if request.method == "GET":
        # 在页面传送过来的时候，取得id字段
        resp_data ={}
        req =request.args
        # 取得id字段  默认值设置为0
        uid = int(req.get("id",0))
        info =None
        if uid:#如果uid存在 则去user
            info=User.query.filter_by( uid = uid ).first()#通过uid去取用户的信息
        # 统一渲染到json里面 将info(用户信息)放到json中去
        resp_data['info'] = info
        return ops_render( "account/set.html",resp_data)

    resp={'code':200,'msg':'操作成功','data':{}}
    req =request.values

    # 后台获取id
    id =req['id'] if 'id' in req else 0

    # 是否在数据字典里面
    nickname =req['nickname'] if 'nickname' in req else ''
    mobile =req['mobile'] if 'mobile' in req else ''
    email =req['email'] if 'email' in req else ''
    login_name =req['login_name'] if 'login_name' in req else ''
    login_pwd =req['login_pwd'] if 'login_pwd' in req else ''

    # 逻辑判断语句：规范输入
    if nickname is None or len(nickname) <1:
        resp['code'] =-1
        resp['msg'] ="请输入复核规范的姓名"
        return jsonify( resp)

    if mobile is None or len(mobile) <1:
        resp['code'] =-1
        resp['msg'] ="请输入复核规范的手机号码"
        return jsonify( resp)

    if email is None or len(email) <1:
        resp['code'] =-1
        resp['msg'] ="请输入复核规范的邮箱"
        return jsonify( resp)

    if login_name is None or len(login_name) <1:
        resp['code'] =-1
        resp['msg'] ="请输入复核规范的登录用户名"
        return jsonify( resp)

    if login_pwd is None or len(login_pwd) <6:
        resp['code'] =-1
        resp['msg'] ="请输入复核规范的登录密码"
        return jsonify( resp)

    # 新增:判断用户名是否重复
    # filter与filter_by(只能传送一个json进去  不需要写类 )相比支持的方式更多，
    # filter（需要写类，因为它不知道是哪一个对象）
    has_in =User.query.filter( User.login_name == login_name,User.uid!= id).first()
    if has_in:
        resp['code']=-1
        resp['msg'] ="该登录名已存在，请换一个试试"
        return jsonify(resp)
    # 根据id查出用户信息是否存在
    user_info =User.query.filter_by(uid =id).first()
    if user_info:
        model_user =user_info
    else:
        # 写入
        model_user = User()  # 初始化
        # 产生时间
        model_user.created_time = getCurrentDate()
        model_user.login_salt = UserService.geneSalt()

    model_user.nickname =nickname
    model_user.mobile = mobile
    model_user.email =email
    model_user.login_name=login_name
    # 对于密码：为了避免每一次密码都会变,所以我们设置密码一开始是******防止加密再加密
    if login_pwd !=default_pwd:
        # 产生密码
        model_user.login_pwd = UserService.genePwd(login_pwd, model_user.login_salt)
    # 更新时间
    model_user.updated_time = getCurrentDate()

    db.session.add( model_user )
    db.session.commit()
    return jsonify(resp)

# 定义一个ops方法  支持post提交
@route_account.route("/ops",methods=["POST"])
def ops():
    resp = {'code': 200, 'msg': '操作成功', 'data': {}}
    req = request.values

    # 三元表达式  判断是否在字典中
    id = req['id'] if 'id' in req else 0
    act = req['act'] if 'act' in req else ''

    # 判断id是否存在
    if not id :
        resp['code'] = -1
        resp['msg'] = "请选择要操作的账号!"
        return jsonify(resp)

    # 判断动作是否在 删除或者恢复的操作李里面
    if act not in ['remove','recover']:
        resp['code'] = -1
        resp['msg'] = "操作有误，请重试"
        return jsonify(resp)

    # 判断用户id是否存在
    user_info =User.query.filter_by(uid=id).first()
    if not user_info:
        resp['code'] = -1
        resp['msg'] = "指定账号不存在！"
        return jsonify(resp)

    # 根据动作判断  如果你的动作 等于 删除动作  那么就让status字段等于0即可
    if act =="remove":
        user_info.status = 0
    elif act=="recover":
        user_info.status = 1
    # 每一次更新的时候 要更新update_time字段 来将时间进行更新
    user_info.update_time =getCurrentDate()
    db.session.add(user_info)
    db.session.commit()
    return jsonify(resp)

